% Esta funcion calcula los polos para una plantilla (La salida es el filtro NORMALIZADO! wp=1)
% No es posible modificar el Q, ya que no tendria sentido, por lo tanto
% devuelve el Q.
% Si le entra un n=0 significa que el usuario no especifico el n y la
% funcion calcula el optimo.
% Si le entra un n, se hace el filtro NORMALIZADO con ese n (Puede o no respetar la plantilla y el unico dato necesario sera el Ap)
% Ap y Aa estan en dB.
function [Z, P, gain, order, Q, wn] = filter_butterworth (filterType, aa, ap, wa, wp, waMENOS, waMAS, wpMENOS, wpMAS, order, Q)
epsilon=sqrt(10^(ap/10)-1);
wn=1;

switch filterType
        case 2
        wn=wa/wp;
        case 3
        wn=wp/wa;
        case 1
        wn=(waMAS-waMENOS)/(wpMAS-wpMENOS);
        case 4
        wn=(wpMAS-wpMENOS)/(waMAS-waMENOS);
end    


if (order == 0)    
     switch filterType
        case 2,
        wn=wa/wp;
        case 3,
        wn=wp/wa;
        case 1,
        wn=(waMAS-waMENOS)/(wpMAS-wpMENOS);
        case 4,
        wn=(wpMAS-wpMENOS)/(waMAS-waMENOS);
    end    
    epsilon=sqrt(10^(ap/10)-1);
    order=ceil(log10(sqrt(10^(aa/10)-1)/epsilon)/log10(wn));
end
if (Q~=0)
    Q2=0;
    order=0;
    while (Q2 <= Q)
    order=order+1;
    Q2=1/(2*sin(pi/(2*order)));
    end 
    order=order-1;
end

P=zeros(1,order);
Q=zeros(1,order);

tita=pi/order;
radio=1/nthroot(epsilon, order);
    for k=1:order
        P(k)=radio*exp(1i*(tita*k + pi/2 - tita/2));
        Q(k)=1/(2*sin((k-1)*tita+tita/2));
    end
Z=[];

gain=1; 
    for i=1:length(P)
        gain=gain*P(i);
        if gain==0 % si la constante se hace muy chica y MatLab redondea a cero la reinicio
            gain=1;
        end
    end
    gain=real(gain);
    
end 
